"""shutdown方法的使用： shutdown(wait=True)：告诉执行器 executor 在当前所有等待的 future 对象运行完毕后，应该释放执行器用到的所有资源。

在 shutdown 之后再调用 Executor.submit() 和 Executor.map() 会报运行时错误 RuntimeError。

如果 wait 为 True，那么这个方法会在所有等待的 future 都执行完毕，并且属于执行器 executor 的资源都释放完之后才会返回。
如果 wait 为 False，本方法会立即返回。属于执行器的资源会在所有等待的 future 执行完毕之后释放。
不管 wait 取值如何，整个 Python 程序在等待的 future 执行完毕之前不会退出。

你可以通过 with 语句来避免显式调用本方法。with 语句会用 wait=True 的默认参数调用 Executor.shutdown() 方法。
"""
from concurrent.futures import ThreadPoolExecutor
import time
import requests


def thread_run(url):
    try:
        print("thread_run is spiderring {} \n".format(url))
        re = requests.get(url=url, timeout=30)
        re.raise_for_status()
        re.encoding = re.apparent_encoding
        return re.text
    except:
        return


def main_thread():
    for i in range(3):
        print("I am the main_thread task, I am running -- {}".format(i))


if __name__ == "__main__":
    executor = ThreadPoolExecutor(max_workers=2)

    future1 = executor.submit(thread_run, "https://blog.csdn.net/weixin_41599977/article/details/92404112")
    future2 = executor.submit(thread_run, "https://blog.csdn.net/weixin_41599977/article/details/91048654")

    executor.shutdown()  # 与进程池pool中的close和join实现的功能一样，关闭pool主进（线）程等待子进（线）程结束后继续往下执行

    main_thread()  # 主线程等到线程池里的子线程运行结束才能执行这里

    ################################################################################################################################

    #     上面方法的一种等价形式
    # urls = [
    #     "https://blog.csdn.net/weixin_41599977/article/details/92404112",
    #     "https://blog.csdn.net/weixin_41599977/article/details/91048654"
    # ]
    # with ThreadPoolExecutor(max_workers=2) as executor:  # 类似于打开文件，省去了executor.shutdown()这一步，建议这样使用
    #     for url in urls:
    #         executor.submit(thread_run, url)

    # main_thread()
